return xc_sysctl(xc_handle, &sysctl);
}
+int xc_get_cpufreq_avgfreq(int xc_handle, int cpuid, int *avg_freq)
+{
+ int ret = 0;
+ DECLARE_SYSCTL;
+
+ if ( (xc_handle < 0) || (!avg_freq) )
+ return -EINVAL;
+
+ sysctl.cmd = XEN_SYSCTL_pm_op;
+ sysctl.u.pm_op.cmd = GET_CPUFREQ_AVGFREQ;
+ sysctl.u.pm_op.cpuid = cpuid;
+ ret = xc_sysctl(xc_handle, &sysctl);
+
+ *avg_freq = sysctl.u.pm_op.get_avgfreq;
+
+ return ret;
+}
+
int xc_get_cputopo(int xc_handle, struct xc_get_cputopo *info)
{
int rc;
int xc_set_cpufreq_gov(int xc_handle, int cpuid, char *govname);
int xc_set_cpufreq_para(int xc_handle, int cpuid,
int ctrl_type, int ctrl_value);
+int xc_get_cpufreq_avgfreq(int xc_handle, int cpuid, int *avg_freq);
struct xc_get_cputopo {
/* IN: maximum addressable entry in
return ret;
}
+static int get_cpufreq_avgfreq(struct xen_sysctl_pm_op *op)
+{
+ if ( !op || !cpu_online(op->cpuid) )
+ return -EINVAL;
+
+ op->get_avgfreq = cpufreq_driver_getavg(op->cpuid, USR_GETAVG);
+
+ return 0;
+}
+
static int get_cputopo (struct xen_sysctl_pm_op *op)
{
uint32_t i, nr_cpus;
break;
}
+ case GET_CPUFREQ_AVGFREQ:
+ {
+ ret = get_cpufreq_avgfreq(op);
+ break;
+ }
+
case XEN_SYSCTL_pm_op_get_cputopo:
{
ret = get_cputopo(op);
#define GET_CPUFREQ_PARA (CPUFREQ_PARA | 0x01)
#define SET_CPUFREQ_GOV (CPUFREQ_PARA | 0x02)
#define SET_CPUFREQ_PARA (CPUFREQ_PARA | 0x03)
+ #define GET_CPUFREQ_AVGFREQ (CPUFREQ_PARA | 0x04)
/* get CPU topology */
#define XEN_SYSCTL_pm_op_get_cputopo 0x20
struct xen_get_cpufreq_para get_para;
struct xen_set_cpufreq_gov set_gov;
struct xen_set_cpufreq_para set_para;
+ uint64_t get_avgfreq;
struct xen_get_cputopo get_topo;
};
};